iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
1

Container 的硬碟空間是短暫的,隨著 Container 生命一同消失,那麼重要的資料該如何保存? 今天會說明 VolumesStorage Class 是什麼,以及該如何使用

什麼是 Volumes ?

kubernetes 中的 VolumesDockerVolumes 是相同的,都是為了解決檔案在 Container 中無法永續存活問題,在 KubernetesValume 具有多種類型,以下挑幾個本機練習可使用到的進行講解:

  • emptyDir
    當服務創立後,該掛載空間也會一併被建立,並賦予讀寫的權限,但當服務被移除後該空間一併會被移除,適合存放不重要資料。

注意: 容器異常時並不會導致 Pod 服務被移除,故 emptyDir 的數據是安全的,需等到 Pod 完全被移除才會一併刪除 emptyDir 資料。

## pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
  • hostPath
    負責將機器上「特定路徑」的文件掛載到 Container 內,且當服務因某些原因重新啟動,或者需要重新建置,檔案仍保存在 Node 上,直到該文件被移除或者該 Node 被移除 Kubernetes Cluster
## pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

什麼是 StorageClass ?

如果要說明什麼是 StorageClass ,應該一併說明 PersistentVolumePersistentVolumeClaim

當用戶在建立 Pod 服務使用到 PVC(PersistentVolumeClaim),這時會自動找一個符合的 PV(PersistentVolume)進行批配,若有批配到就直接逕行綁定(此時表示與PV進行「靜態」批配),但是如果沒有符合的 PV,則會透過StorageClass建立一個新的PV再和PVC綁定(此時表示與PV進行「動態」批配)。

PersistentVolume 概念也是跟 Volume 差不多,用意都是在協助保存資料,將資料永久化,只是開發人員不需要再為了檔案要保留在哪個空間而感到困擾,試著想像一下如果有1個Nginx服務,我們需要將 nginx.conf 掛載,偏偏 kubernetes 又會協助將服務建置在 Loading 輕的 Node上,為了讓服務能正常啟動,每台 Node 上都需要掛載 nginx.conf,又或者當服務越來越多時,掛載數量也會越來越多...相對的就比較不容易管理,這時當然就是推薦使用 PersistentVolume 啦,請看看下方圖片:


(圖片取自網路)

系統管理人員負責建置 PV ,而開發人員則是負責建立 PVCStorage Class,並交由 PVC 自動尋找合適的 PV進行綁定,或者透過StorageClass建立一個新的PV再和PVC綁定

那麼 PersistentVolume 數量這麼多,該如何找到適合的呢? 這時候當然是要由系統管理人員對 PersistentVolume 進行分類,也就是說在建立 PersistentVolume 同時必須賦予有意義的 Label或者 storgeClassName 做為識別證,另外也需要規範回收策略,例如:

  • Delete: 當不再使用 Storage Class 時,一併移除資料(default)
  • Retain: 當不再使用 Storage Class 時,資料會保留等待手動刪除

什麼是 PersistentVolume?

PersistentVolume 是存放資源的地方,簡單想像的話就是個 Disk 空間, PersistentVolume 分為兩種:

  • 靜態:手動建立 PersistentVolume 稱為「靜態」綁定
  • 動態:PVC在批配 PV時,若不符合規則會透過 StorageClass 自動建立新的PV,此時PV我們會稱為「動態」綁定,並且繼承 StorageClass 規定的回收政策。

PV 建立時,可以設定以下內容:

  • PV的屬性.比如,存儲類型,Volume的大小等.
  • 創建這種PV需要用到的存儲插件

相對的 StorageClass 也可以加入此兩項設定,當 PVC 無法批配符合的 PV 時,才可以透過 StorageClass 協助動態建置 PV

什麼是 PersistentVolumeClaim?

PVC(PersistentVolumeClaim)```` 負責批配符合條件的 PV,並與該 PV``` 進行綁定。

PVC提供三種與PV中的檔案存取模式:

  • ReadWriteOnce:只可以掛載在同一個 Node 上提供讀寫功能。
  • ReadOnlyMany :可以在多個 Node 上提供讀取功能。
  • ReadWriteMany:可以在多個 Node 上提供讀寫功能。

PVC 該如何與 PV 進行綁定:

  • 透過 storageClassName 名稱,找到相同 PV
  • 透過 Label 標籤,找到相同 PV

範例:(下方案例為手動建置 PV)

建立 StorageClassPVCPV

## storageclass.yaml
apiVersion: storage.k8s.io/v1            ## API 版本
kind: StorageClass                       ## 元件種類
metadata:
  name: ssd                              ## storage class 名稱
provisioner: kubernetes.io/gce-pd        ## 指定 Volumn 類型
parameters:                              ## PV 符合條件
  type: pd-ssd
reclaimPolicy: Retain                    ## 回收機制
## pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ssd
  hostPath:
    path: /tmp
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-storage
spec:
  storageClassName: ssd
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

上一篇
Day25 了解 K8S 的 ConfigMap & Secret
下一篇
Day27 了解 K8S 的 Namespace & Labels
系列文
就是「懶」才更需要重視DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言